package jhlee42.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class Jtables extends JFrame {

	private JPanel contentPane;
	private JTable table;
	private JTable table_1;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Jtables frame = new Jtables();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Jtables() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 640, 480);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		JPanel panel = new JPanel();
		panel.setBackground(Color.PINK);
		panel.setPreferredSize(new Dimension(425, 10));
		contentPane.add(panel, BorderLayout.CENTER);
		panel.setLayout(new BorderLayout(0, 0));
		
		JPanel panel_2 = new JPanel();
		panel.add(panel_2, BorderLayout.NORTH);
		
		JButton btnNewButton_1 = new JButton("New button");
		panel_2.add(btnNewButton_1);
		
		JButton button_1 = new JButton("New button");
		panel_2.add(button_1);
		
		JPanel panel_5 = new JPanel();
		panel.add(panel_5, BorderLayout.SOUTH);
		
		JPanel panel_6 = new JPanel();
		panel.add(panel_6, BorderLayout.CENTER);
		panel_6.setLayout(new BorderLayout(0, 0));
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setPreferredSize(new Dimension(325, 150));
		panel_6.add(scrollPane, BorderLayout.NORTH);
		
		
		
/*********************** 자바 테이블 ***********************/	
		
		// Jtable에 저장할 성적 데이터 작성
		// 먼저 ArrayList에 테이터들을 생성함
		
		ArrayList<SungJuk2VO> sjlist = new ArrayList<>(); // 데이터 베이스는 ArrayList<> 에 연동을 해서 사용..
		sjlist.add(new SungJuk2VO("태희", 99, 98, 99));
		sjlist.add(new SungJuk2VO("수지", 89, 88, 89));
		sjlist.add(new SungJuk2VO("혜교", 79, 78, 79));
		
		// ArrayList에 작성된 데이터들을 Jtable에 표시하려면 DefaultTableModel 객체를 생성한 후 addRow로 데이터를 추가해야 함
		DefaultTableModel model = new DefaultTableModel();
		
		// 단, Jtable의 외형적인 모양이나 특정 기능을 비활성시키고 싶다면
		// DefaultTableModel를 내부 클래스 형태로 선언해야 함.
		
		model = new DefaultTableModel(){
			boolean[] isEdit = new boolean[]{false,false,false,false};			
			@Override
			public boolean isCellEditable(int row, int column) { // 내부 클래스를 하면 제조사에서 만든 것을 사용자에 맞게 사용을 하겠다..
				return isEdit[column]; // 모든열 수정 불가
			}
		};
		
		System.out.println(model.isCellEditable(0, 0));
		
		// 먼저, 제목행부터 설정
		model.setColumnIdentifiers(new String[]{"이름","국어","영어","수학"});
		// 본문행 작성
		for(SungJuk2VO sj : sjlist){
			model.addRow(new String[]{sj.getName(),sj.getKor()+"",sj.getEng()+"",sj.getMat()+""});
		}
		
		
		
		// 생성한 model을 jtable에 적용(생성자 이용)
		table = new javax.swing.JTable(model); // table = new JTable();
		
		
		
		// Jtable에 기본적으로 적용된 배경색, 선택색을 
		// 변경하려면 JTable 생성시 내부 클래스를 이용
		// 또한, prepareRenderer 메서드를 재정의 해야함
		table_1 = new JTable(){
			@Override
			public Component prepareRenderer(TableCellRenderer renderer,int row, int column) {
				// JTable의 각 열에 미리 정의 된 prepareRenderer 호출
				Component c = super.prepareRenderer(renderer, row, column);
				// 배경색과 선택색 지정
				Color c1 = new Color(204,255,153);
				Color c2 = Color.WHITE;
				// 각 셀의 배경색 변경
				if(!c.getBackground().equals(getSelectionBackground())){
					Color bg = c2; // 배경색 2 지정
					if(row%2 ==0) bg = c1;
					c.setBackground(bg);bg = null;
				}// if
				return c;			
			}
		};
		
		
		
		

				
		
		
		
		
		
		// JTable 모델 적용
		table_1.setModel(model);
		
		
		
		
		
		// Jtable의 외형 변경
		table_1.setSelectionBackground(new Color(255,0,0));// 선택시 배경색 변경
		table_1.setSelectionForeground(new Color(255,255,255));// 선택시 배경색 변경
		table_1.setRowHeight(25);  // 행 높이
		table_1.getTableHeader().setReorderingAllowed(false); // 열 이동불가
		table_1.getTableHeader().setPreferredSize(new Dimension(10,30)); // WIDTH,HEIGHT
		
		table_1.getColumn("이름").setPreferredWidth(40); // 특정 열의 너비 지정
		
		
		
		
		// 각 열의 외형을 변경하려면 DefaultTableCellRengerer 객체를 이용
		DefaultTableCellRenderer render= (DefaultTableCellRenderer)table_1.getDefaultRenderer(JTable.class);
		render.setHorizontalAlignment(SwingConstants.CENTER);
		
		// 본문행을 가운데로 정렬
		
		// Jtable에 마우스 클릭 이벤트 지정
		table_1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount()==2) { // 더블클릭시
					JOptionPane.showMessageDialog(null, "더블 클릭됨");
					JTable t = (JTable)e.getSource();
					int row = t.getSelectedRow();// 행
					int col = t.getSelectedColumn();//열
					JOptionPane.showMessageDialog(null, t.getValueAt(row, col));	
				}// if 
			} // click
		});

		
		
		
		table_1.setPreferredSize(new Dimension(300, 150));
		scrollPane.setViewportView(table_1);
		
		
		
		
/********************************************************/	
		
		
		
		
		JPanel panel_1 = new JPanel();
		panel_1.setBackground(Color.ORANGE);
		panel_1.setPreferredSize(new Dimension(185, 10));
		contentPane.add(panel_1, BorderLayout.EAST);
		panel_1.setLayout(new BorderLayout(0, 0));
		
		JPanel panel_3 = new JPanel();
		panel_1.add(panel_3, BorderLayout.NORTH);
		
		final JLabel photo = new JLabel("");
		photo.setBorder(new LineBorder(Color.GRAY, 1, true));
		photo.setPreferredSize(new Dimension(100, 150));
		panel_3.add(photo);
		
		JPanel panel_4 = new JPanel();
		panel_4.setPreferredSize(new Dimension(10, 50));
		panel_1.add(panel_4, BorderLayout.SOUTH);
		
		JButton btnNewButton = new JButton("사진등록1");
		
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 사진 등록
				// 이미지만 처리하기 위해
				// 파일 확장자 필터를 등록
			
				
				FileNameExtensionFilter filter = new FileNameExtensionFilter("이미지 파일들", "jpg","png");
				
				
				JFileChooser fc = new JFileChooser();
				// 필터를 파일열기 대화상자에 등록
				
				
			
				fc.setFileFilter(filter);
				fc.addChoosableFileFilter(filter);
				
				
				
				
				
				
				// 파일 열기 대화상자를 화면에 띄우고
				// 선택한 값을 ret 에 저장
				int ret = fc.showOpenDialog(Jtables.this);// 모달 창이기 때문에 .this
				// 대화상자에서 열기를 클릭하면 
				if(ret==JFileChooser.APPROVE_OPTION){
					// 선택한 파일의 전체 경로를 알아냄
					String img = fc.getSelectedFile().getPath();
					
					// 선택한 이미지를 지정한 장소에 저장
					String savePath = "c:/java/myPhoto/"+fc.getSelectedFile().getName(); // 파일이름만 불러올수 있다.
					
					// 이미지를 다루기 위해 BufferedImage 객체 선택
					BufferedImage image = null;
					try {
						// 읽어올 파이을 File 객체로 생성
						File f = new File(fc.getSelectedFile().getPath());
						// File 객체로 지정한 파일을 읽어서 
						// 이미지 객체로 저장
						image = ImageIO.read(f);
						// ImageIO 객체로 읽은 내용을 지정한 이미지로 저장
						ImageIO.write(image, "jpg", new File(savePath));
					} catch (Exception ex) {
						ex.printStackTrace();
					}
					
					
					
					// Jlabel에 사진 표시
					//photo.setIcon(new ImageIcon(img));
					photo.setIcon(new ImageIcon(savePath));
					
					
					
					
					
				}
			}
		});
		
		
		
		
		
		
		
		
		
		
		
		
		
	
		
		panel_4.add(btnNewButton);
		
		JButton button = new JButton("사진등록2");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				FileNameExtensionFilter filter = new FileNameExtensionFilter("이미지 파일들", "jpg","png");
				JFileChooser fc = new JFileChooser();
				// 필터를 파일열기 대화상자에 등록
				fc.setFileFilter(filter);
				int ret = fc.showOpenDialog(Jtables.this);// 모달 창이기 때문에 .this
				// 대화상자에서 열기를 클릭하면 
				if(ret==JFileChooser.APPROVE_OPTION){
					String sql1=" insert into Swingimage "+" (imgno,img)values(1,?) ";
					String sql2=" select * from Swingimage ";
					
					String DRV = "oracle.jdbc.driver.OracleDriver";
					String URL = "jdbc:oracle:thin:@112.216.253.124:1521:xe";
					
					
					
					//1. 이미지를 blob 형식으로 dbdp wjwkd
					Connection conn = null;
					try {
						
						// db 에 저장할 파일 지정
						FileInputStream fin = new FileInputStream(
									new File(fc.getSelectedFile().getPath())
								);
						
						
						
						
						
						Class.forName(DRV);
						conn = DriverManager.getConnection(URL,"jhlee183","jhlee183");
						// 이미지 파일의 내용을 이진 스트림으로 읽어 blob 형식으로 db에 저장
						PreparedStatement p = conn.prepareStatement(sql1);
						p.setBinaryStream(1, fin,fin.available());
						p.executeUpdate();
						p.close();
						
						JOptionPane.showMessageDialog(null, "사진등록 완료!");
						
						
						
					} catch (Exception ex) {
						ex.printStackTrace();
					} finally{
						try {
							conn.close();
						} catch (SQLException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						
					}
					
					
/***********************************************************************************/		
// 드라이브 추가!!
//	javaSwing 프로젝트
//	우클릭
//	BuildPath
//	Add external archi~~...
//	추가~

/***********************************************************************************/					
				
					
					
					
					//2. db에 저장된 blob 형식의 이미지를 출력
					try {
						Class.forName(DRV);
						conn = DriverManager.getConnection(URL,"jhlee183","jhlee183");
						PreparedStatement p = conn.prepareStatement(sql2);
						ResultSet rs = p.executeQuery();
						//blod 이미지를 저장하려면
						//byte 배열 형식의 변수 필요
						
						byte[] imgs = null;
						if(rs.next()){
							imgs = rs.getBytes(2);
						}
						// byte 배열의 이미지 데이터를 Image 객체로 생성
						//Image img = Toolkit.getDefaultToolkit().createImage(imgs);
						// Image 객체를 ImageIcon으로 변환해서 JLabel의 setIcon으로 지정
						photo.setIcon(new ImageIcon(imgs));
						
						
					} catch (Exception ex) {
						ex.printStackTrace();
					} finally{
						try {
							conn.close();
						} catch (SQLException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
					
					
					
					
					//if
				}
				

				
			}  // public void actionPerformed(ActionEvent e)
		});  // 버튼 리스너
		panel_4.add(button);
		
		
		
		
	} // JFrame
} // public class Jtables
